import json
from django.http import JsonResponse,HttpResponseForbidden
from django.shortcuts import render, redirect
from goods.models import SKU
from carts.models import Carts
from django.views import View
from tools.response_code import RETCODE
# 在urls文件中将光标定位到视图类的名字上，alt + 回车，可以在views.py 中给你创建一个类
from alipay import AliPay
class CartView(View):
    def post(self,request):
        '''添加购物车'''
        # 接收参数
        json_dict = json.loads(request.body.decode())
        sku_id = json_dict.get('sku_id')
        count = json_dict.get('count')
        # 判断用户是否登录
        if not request.user.is_authenticated:
            return JsonResponse({'code':RETCODE.SESSIONERR,'errmsg':'用户未登录不能添加购物车'})
        # 前端传的数据是否完整
        if not sku_id or not count:    # if not all([sku_id,count]):
            return HttpResponseForbidden('缺少参数')
        # 判断sku_id 是否在sku的表中存在
        if not SKU.objects.filter(id = sku_id).exists():
            return HttpResponseForbidden('商品id参数不正确')
        # 数据添加到carts 表中 添加的时候还判断，Carts 表中sku 是否已存在，如果存在则只修改数量，如果不存在，添加一条记录
        cart_sku,created = Carts.objects.get_or_create(user=request.user,sku_id=sku_id,is_delete=False)
        if created:
            # 表中原来没有，刚创建的一条count为0的数据
            cart_sku.count = count
            cart_sku.save()
        else:
            # 表中原来有数据，需要将原来的count 进行累加
            cart_sku.count += count
            cart_sku.save()
        # 响应数据
        return JsonResponse({'code':RETCODE.OK,'errmsg':'添加购物车成功'})

    def get(self,request):
        '''展示购物车'''
        # 判断是否登录，没登录，去登录
        if not request.user.is_authenticated:
            # 如果没登录，就去登录重定向到登录界面
            return redirect('user:login')
        # 查询数据 ,查询购物车表中当前用户的所有未删除的商品
        cart_sku_qs = Carts.objects.filter(user=request.user,is_delete=False)
        # 封装前端需要格式的数据
        cart_skus=[]
        for cart_sku in cart_sku_qs:
            # cart_sku 是购物车表中的一条记录
            # cart_sku.sku 是SKU 表中对应的记录
            cart_skus.append({
                'id':cart_sku.id, # 购物车中商品的id
                'name':cart_sku.sku.name,
                'default_image_url':cart_sku.sku.default_image.url,
                'price':str(cart_sku.sku.price),#数据类型是decimal
                'selected':str(cart_sku.selected),# 数据类型是python的布尔值
                'count':cart_sku.count,
                'amount':str(cart_sku.sku.price*cart_sku.count),#数据类型是decimal
            })
        return render(request,'cart.html',locals())


    def put(self,request):
        '''更新购物车（修改）'''
        # 接收数据， sku_id、count 、 selected
        json_dict = json.loads(request.body.decode())
        sku_id = json_dict.get('sku_id')
        count = json_dict.get('count')
        selected = json_dict.get('selected')
        # 校验数据 所有数据不能为空、sku——id 是不是真实有效
        if not all([sku_id,count]):
            # 如果这三个数据有一个为空则会执行这个代码段中的数据
            return HttpResponseForbidden('缺少必要的参数')
        sku_exists = Carts.objects.filter(id = sku_id).exists()
        if not sku_exists:
            # 走到这个代码段说明，这个skuID 不是一个真是有效的
            return HttpResponseForbidden('商品不存在')
        # 更新数据，针对传入的skuid 修改对应sku的 count 、 selected
        carts_sku = Carts.objects.get(id = sku_id,user= request.user)
        carts_sku.count=count
        carts_sku.selected = selected
        carts_sku.save()
        # 响应数据
        # 查询数据 ,查询购物车表中当前的商品,重新封装成一个字典，为了给前端传json
        cart_sku={
            'id': carts_sku.id,  # 购物车中商品的id
            'name': carts_sku.sku.name,
            'default_image_url': carts_sku.sku.default_image.url,
            'selected': carts_sku.selected,
            'count': carts_sku.count,
            'price':str(carts_sku.sku.price),
            'amount': str(carts_sku.sku.price * carts_sku.count),
        }
        return JsonResponse({'code':RETCODE.OK,'errmsg':'OK','cart_sku':cart_sku})


    def delete(self,request):
        '''删除购物车中的商品记录'''
        # 接收数据 sku_id
        json_dict = json.loads(request.body.decode())
        sku_id = json_dict.get('sku_id')
        # 校验数据
        sku_exists = Carts.objects.filter(id=sku_id).exists()
        if not sku_exists:
            # 走到这个代码段说明，这个skuID 不是一个真是有效的
            return HttpResponseForbidden('商品不存在')
        carts_sku = Carts.objects.get(id=sku_id,user=request.user)
        carts_sku.is_delete = True
        carts_sku.save()

        return JsonResponse({'code':RETCODE.OK,'errmsg':'OK'})


class SelectAllView(View):
    '''购物车全选'''
    def put(self,request):
        # 接一下参数
        json_dict = json.loads(request.body.decode())
        selected = json_dict.get('selected')
        print(selected,type(selected))
        # 查询出当前用户的购物车中所有没有被删除的商品，将他们的selected字段全部赋值成True
        Carts.objects.filter(user=request.user,is_delete=False).update(selected=selected)
        # 返响应，不需要返回数据
        return JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK'})


class CartsSimpleView(View):
    ''' 简单购物车'''
    def get(self,request):
        # 判断当前用户是否登录了
        if request.user.is_authenticated:
            # 登录了，就查询当前用户购物车中所有未删除的商品 ，query——set
            cart_sku_qs = Carts.objects.filter(user=request.user,is_delete=False)
            # 重新对数据进行封装 ，前端要求是json格式，
            cart_skus=[]
            for cart_sku in cart_sku_qs:
                cart_skus.append({
                    'id':cart_sku.id,
                    'name':cart_sku.sku.name,
                    'default_image_url':cart_sku.sku.default_image.url,
                    'count':cart_sku.count,
                })
            # 返回响应 cart_skus
            return JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK','cart_skus':cart_skus})
        else:
            return JsonResponse({'code': RETCODE.SESSIONERR, 'errmsg': '用户未登录错误'})


